package wangwenjun.phase2.concurrencypattern.threadcontext.context;

import lombok.Data;

/**
 * @author ChangLiang
 * @date 2020/6/15
 */
@Data
public class ApplicationContextV1 {

    /**
     * ApplicationContext是系统上下文，其生命周期会随着被创建一直到系统运行结束
     * 其系统上下文成员configuration以及runtimeInfo 与其生命周期相同
     *
     * 考虑点1：ApplicationContext需要系统内全局唯一
     * 解决方案：通过单例模式来保证
     *
     * 考虑点2：系统上下文成员只能被初始化一次 比如ApplicationConfiguration
     *
     * 考虑点3：在多线程环境下，系统上下文成员的线程安全性
     * 解决方案：如Single Thread Execution模式(synchronized) 或者 不可变对象设计模式 或者CAS(AtomicInteger) 等资源保护方法
     */

    private ApplicationConfiguration configuration;

    private RuntimeInfo runtimeInfo;

    private static class Holder{
        private static ApplicationContextV1 instance = new ApplicationContextV1();
    }

    public static ApplicationContextV1 getApplicationContext() {
        return Holder.instance;
    }
}
